Skip to content

docs(dnn): i18n porting mechanism investigation (read-only) — coupled-release critical path - #669

Merged
jsboige merged 1 commit into
masterfrom
docs/dnn-i18n-porting-mechanism
Jul 3, 2026
Merged

docs(dnn): i18n porting mechanism investigation (read-only) — coupled-release critical path#669
jsboige merged 1 commit into
masterfrom
docs/dnn-i18n-porting-mechanism

Conversation

@jsboige

@jsboige jsboige commented Jul 3, 2026

Copy link
Copy Markdown
Contributor

What

Read-only investigation of the mechanism for publishing the Argumentum DNN site content in the 7 non-FR languages (EN/RU/PT/ES/AR/FA/ZH) — the coupled-release critical path (ai-01 dispatch 8b3ymj). Builds on the prod coverage audit #662 (site is FR-only, 7 translations not published).

DoD met: mechanism + per-language effort estimate + step plan. Read-only — 0 prod write, 0 DB mutation.

Key findings

Effort (per language, 7 targets)

  • Fixed cost (once, jsboige/RDP-gated): portal/2sxc export (the single hard unblocker) → DNN content-language enablement → URL routing + switcher population → RulesExplorer view refactor (port the loc() pattern).
  • Variable cost (per language): rule prose (~30 rich entities × 7, chunked gpt-5.5 — dominant) + UI strings (10 keys, seconds via feat(dataset-updater): #457 DNN UI strings localization infra (Enabled=false) #487) + HTML pages (~37K chars) + Resources values. Comparable to one Scenarii-scale DatasetUpdater run per language once prep is in place.
  • Honest uncertainty: the Rule content-type field model (lang-suffixed vs EAV dimensions) and the fallacy-content coverage (0-to-large) cannot be resolved without the portal export.

Step plan

  1. [jsboige] Portal / 2sxc App export — unblocks everything.
  2. [analysis] Inspect exported content-types → decide Rule field model (recommend lang-suffixed + loc(), mirroring feat(dnn-i18n): #457 translate DNN UI strings FR -> 7 langs via gpt-5.5 #490).
  3. [worker, code] RulesExplorer view refactor — port loc() into both Rule views; extract hardcoded players string.
  4. [jsboige] DNN config — enable 7 languages, wire routing, populate switcher.
  5. [worker, translation] Localize content per language; re-import to 2sxc.
  6. [ai-01] Visual validation per language (RTL/CJK/Cyrillic).

Recommendation

Consistent with #662: a post-tag candidate for v0.9.0 assets (decisions #27, #16), but on the critical path of the coupled release. The portal export (step 1) is the schedule-critical prerequisite (jsboige). The highest-leverage worker-able prep today is the RulesExplorer view refactor (step 3) — it mirrors the proven FallacyExplorer pattern and unblocks the code side independently of the DB export.

Gate boundaries

Read-only: 0 prod write, 0 DB mutation, no portal export attempted, no #487 enablement, no QA verdict (ai-01 only). All evidence source-level at master 27442add (base of this PR).

Relates: #457 #487 #490 #662 #134 #140.

🤖 Worker po-2023 (GLM)

Investigate the mechanism for publishing DNN site content in the 7 non-FR
languages (coupled-release critical path, ai-01 dispatch 8b3ymj). Builds on
prod coverage audit #662 (site FR-only).

Key findings:
- Two bespoke apps at different i18n maturity: FallacyExplorer is
  multilingual-ready post-#490 (loc() helper, CmsContext.Culture cascade,
  lang-suffixed fields text_fr/text_en/...); RulesExplorer is FR-only
  (generic fields ruleEntity.Summary/.Material/..., no culture logic,
  hardcoded FR) — the direct cause of the #662 FR-only verdict.
- The site Rules content (Summary/Material/Installation/Content/Variants/
  Memo) is DB-only, manually-authored — it does NOT match the Rules CSV
  columns (Text/Text_en/...). The CSV translations are not reusable as-is;
  porting is prose translation of DB content.
- 3 localization layers: L1 UI strings (#487 rail built, gated on portal
  export for res.* values), L2 static HTML (not wired), L3 content items
  (DB-only bulk — the dominant cost).

DoD met: mechanism + per-language effort estimate + step plan.
Read-only: 0 prod write, 0 DB mutation. Portal/2sxc export (jsboige) is the
single hard unblocker. Highest-leverage worker-able prep = RulesExplorer
view refactor (mirror the proven FallacyExplorer loc() pattern).

Relates: #457 #487 #490 #662 #134 #140.

Co-Authored-By: Claude-Code <noreply@anthropic.com>

@clusterManager-Myia clusterManager-Myia left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[NanoClaw] — LGTM

Read-only investigation (+222/-0, single new file). Code-level evidence verified firsthand:

  • Root-cause claim confirmed_RulesExplorer_RuleList.cshtml L15 reads de @ruleEntity.MinNbPlayers &agrave; @ruleEntity.MaxNbPlayers joueurs (hardcoded FR) + L18 @Html.Raw(ruleEntity.Summary) (generic field, no culture logic). No loc(), no CmsContext.Culture anywhere in the Rule views. This is exactly why audit #662 found the rules page FR-only. Sound diagnosis.
  • The #490 contrast is real_FallacyExplorer_Root.cshtml confirmed post-#490: L9 lang = (CmsContext.Culture.CurrentCode ?? "fr-fr")..., L19-21 the loc() helper with lang-suffixed field selection, L36/40/41 @loc(fallacy,"text"/"desc"/"link"). FallacyExplorer is genuinely code-ready for 8 langs; RulesExplorer is not. The two-apps/two-models framing holds.
  • §2c field-mismatch argument sound — site Rule content-type (Summary/Material/Installation/Content/Variants/Memo) vs CSV Text* columns (print/PDF rules) are genuinely different artifacts; the 8 CSV translations are not reusable as-is for the site. Correctly identifies the port as prose-translation-of-DB-content, not a CSV remap — and DB-gated.
  • Cross-refs resolve457-site-content-type-inventory.md (6765B), PHASE1-content-audit.md (9320B), 2026-07-03-dnn-prod-rules-coverage.md (6908B) all EXIST; #487/#490/#662 all merged. (#457 is an epic issue, not a PR — consistent.)
  • Honest gate boundaries — explicitly read-only (0 prod write, 0 DB mutation); the RulesExplorer refactor is a proposal, not executed; #487 rail not enabled; no QA verdict (ai-01 lane). §6 correctly scopes it as post-tag for v0.9.0 assets, critical-path only if the coupled-release ships multilingual.

△ Nit (non-blocking): the §2a .cshtml block is simplified pseudocode — the real L21 uses ((IDictionary<string, object>)f).ContainsKey(...) cast (not bare f.ContainsKey) and L9 .Split(new[] { '-' })[0]. Logic identical, reasonable docs simplification, but a reader copy-pasting the snippet verbatim would miss the cast needed for the dynamic 2sxc entity. §7 already lists the templates as sources, so reproducibility is intact.

High-quality investigation; the portal-export-as-prerequisite + RulesExplorer-refactor-as-highest-leverage-prep recommendations are well-reasoned.

@jsboige
jsboige merged commit 4e786a9 into master Jul 3, 2026
3 checks passed
@jsboige
jsboige deleted the docs/dnn-i18n-porting-mechanism branch July 3, 2026 23:10
jsboige added a commit that referenced this pull request Jul 4, 2026
…-only binary scan) (#687)

Dispatch lev5ct primary (2sxc export unblocked, voie #2 = local backup scan).
Read-only extraction from the production DNN backup to unblock the i18n portage
field-model decision (#682).

Findings (signal, not PASS):
- Rule content-type uses GENERIC single-value fields (EntityTitle, Summary,
  Material, MinNbPlayers, ...) — confirmed at DB level. ZERO language-suffixed
  fields (Summary_en/Summary_fr absent). Confirms #669 §2c from the view audit.
- Production EAV is dimensioned FR+EN only. ru/ar/fa/zh = trace noise; pt/es
  absent. The 6 release target languages are NOT usable EAV dimensions today.
- => #682 field-model decision effectively FORCED toward Path A (lang-suffixed
  + loc(), mirror #490 / PR #674): Path B (EAV dimensions) would require
  enabling 5 new DNN content cultures before any translation can attach.

Blocker (honest): clean SQL restore denied — jsboi Windows login is not
sysadmin on MSSQL$SQLEXPRESS, sa password not in keychain (not guessed, out of
read-only scope). Two clean unblockers documented (sysadmin grant OR sa pwd OR
voie-1 Playwright export). The binary-scan findings are already conclusive for
the portage-direction decision; full per-attribute enumeration gated on the
unblocker.

Gate: read-only. No prod write, no DB mutation, no credential in the diff.

Refs #681, #682, #674, #669. Dispatch msg-20260704T130644-lev5ct.

Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 4, 2026
… review entry) (#688)

Dispatch lev5ct secondary (jsboige wants to verify ALL docs before tagging).
One index → one link + one "à vérifier" line per doc, so the whole release
documentation can be eyeball-reviewed in a single pass.

Grouped in 9 sections:
- §1 TAG GATE: RELEASE-VALIDATION-v0.9.0.md (v4 fresh, 80 PDFs, verdicts #140/#632)
- §2 Release notes: consolidated #659 (paste-ready) + CHANGELOG gap flag
- §3 CMYK (PdfCmykPostProcess README + GDrive CMYK_COLOR_PROOF note)
- §4 Pipeline resilience (retry smoke #680)
- §5 DNN i18n / go-live (#669 mechanism, #681 schema export, #662 coverage)
- §6 Coverage audits (Rules #661, polish sweep #667, taxonomy coherence,
  scanner-fp #642, prod hygiene)
- §7 Mindmaps/OWL (#499 Phase2 confirm, FR-frozen mechanism, OWL EN+FR-only scope)
- §8 Polish/misc (#654 mnemonics, #629 CardPen, #415 repo, #141 crossLink)
- §9 Stale framework docs flagged (64-PDF superseded — NOT tag-gate)

Key flags surfaced for jsboige:
- CHANGELOG.md is the single biggest gap — predates bundle v3 entirely (no
  CMYK/80-PDF/P&P Standard/Light/Ghostscript/deadlock/logger). Needs an update
  pass before tag.
- 5 framework docs still assert "64 PDFs" (superseded by dossier v4) — flagged
  to avoid cold-read confusion, none is the tag-gate.
- OWL scope = EN+FR only (not 8-lang) — release notes must reflect this honest
  scoping.

All paths verified on master 7590dfb (post cycle-3 batch merges).

Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 4, 2026
…#692)

Precise cartography of Rule prose exists/missing per language: CSV (card-print)
vs DNN site. Triggered by ai-01 dispatch sde6s0 (secondary). Read-only.

Findings (base master 21e2c66):
- CSV Rules: 15 rows x 8 langs = 120/120 cells filled, 0 FR-leak on master
  (native script verified: Cyrillic/CJK/RTL spot-checks).
- P&P Rules CSV: 6 rows x 8 langs = 48/48 cells filled, 0 leak.
- DNN site (reconciled from #662): 5/5 jeux FR published, 7 langs unpublished;
  richer HTML content, DB-only.
- Conclusion: CSV != site content (#669 §2c). The #684 gap is site-DB content
  (~30 rich HTML entities, FR-only), NOT a CSV-coverage gap. CSV is a secondary
  reference for #684, not the translation source.

Corrects a false-positive: an initial scan on the dnn/sandbox-runtime-1032
branch flagged Rules_15 ru as FR-contaminated; verified native Russian on
master (0 FR markers). No action needed.

Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 4, 2026
…ing + switcher) (#693)

Design sketch (no prod execution) for step 4 of the #669 DNN i18n portage plan.
Triggered by ai-01 dispatch sde6s0 (tertiary). jsboige-owned, parallel/non-blocked.

Covers the 3 DNN-config layers to serve 8 cultures:
- DNN content languages: enable 7 cultures (en/ru/pt/es/ar/fa/zh), FR canonical.
- URL routing: path-based vs query-string (decision = jsboige, current state
  both broken: /en-US/ 404, ?language= ignored, <html lang> stuck fr-FR).
- Language switcher: populate the <div class="language"> shell shipped by #490
  (currently unpopulated).
- <html lang>/<dir> reflection (RTL for ar/fa; #685 visual QA entry condition).

Key insight: 2sxc loc() cascade (FallacyExplorer post-#490, RulesExplorer
post-#674) already reads CmsContext.Culture.CurrentCode. #683 is purely the
upstream DNN-config layer that makes CmsContext.Culture return the right value.
Path A (lang-suffixed fields + loc()) does NOT need 2sxc EAV dimensioning.

Design only: no prod write, no admin change, no web.config mutation. Decision
points surfaced for jsboige (routing mode, culture codes, switcher UX, timing).

Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 5, 2026
…ng list (49 fields) (#694)

Decision-input for #682 (step 2 of the #669 portage plan). Triggered by ai-01
dispatch 0hbg9t (primary). Analysis only — no DB write.

Recommendation: Path A (lang-suffixed fields + loc() cascade, mirror #490/#674).
- Provision 7 translatable fields x 7 non-FR langs = 49 new suffixed fields on
  the Rule content-type (EntityTitle/Summary/Material/Installation/Content/
  Variants/Memo x en/ru/pt/es/ar/fa/zh).
- FR stays canonical (unsuffixed) — no data migration.
- Path B (EAV dimensions) rejected: prod EAV is FR+EN only (#687), Path B would
  block on enabling 5 cultures + their dimensions; Path A needs none of that.

Exact field-list derived from #669 Sec 2c (view-template audit) + #687 (binary
scan) + PR #674 Loc() cascade (7 fields routed). The 4th-fallback design
(generic = FR canonical) preserves current FR rendering during transition.

Open (gated): exact 2sxc attribute types (String/Hyperlink/...) remain gated
on the sysadmin unblocker (#687 Sec 3 — jsboi has no server role, not mapped
in ArgumentumGames DB). Best-effort inference provided; jsboige confirms via
live 2sxc editor. Re-verified the sysadmin blocker this tick (still active).

Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 5, 2026
…gs, prep) (#696)

Manifest/prep for #684 (step 5 of the #669 portage plan, the dominant cost).
Triggered by ai-01 dispatch 0hbg9t (secondary). Prolongs #692. Enabled=false,
no execution.

Covers:
- Entity inventory: ~30 rich-HTML prose entities (6 fields x ~5 games) x 7
  target langs = ~210 translation units (exact count gated on #681 export).
- Source = 2sxc Rule content-type FR entities (#681 export, jsboige), NOT the
  Rules CSV (#692 = secondary reference; site content richer HTML DB-only).
- Sink = 49 suffixed fields provisioned by #682.
- Chunking: Scenarii-style SequentialChunks ChunkSize>=12, OpenRouter
  gpt-5.5, HTML-preservation prompt, max_completion_tokens ~7000.
- DatasetUpdater task config sketch (Enabled=false), fields = raw export
  headers.
- Re-import plan: entity count parity, 0 FR-contaminated cell guard
  (#216-style, model = Rules CSV scan #692), harvest invariance check.
- Per-lang effort: one DatasetUpdater pass comparable to Scenarii 167x8.

Manifest only: no translation, no API calls, no DB write. Gated on
#681/#682/#674/#683.

Co-authored-by: Claude-Code <noreply@anthropic.com>
jsboige added a commit that referenced this pull request Jul 11, 2026
…view + Δ1/Δ2 manifest) (#772)

jsboige arbitrated the 4 res.Rule* reconciliation deltas in interactive session
(2026-07-11, consigned #458). This PR ships the 2 repo-side deltas + stages the
2 DB-side deltas as a provisioning manifest for ops.

Repo-side (land via this PR):
- Δ3 RuleMemoCardFileNamePrefix: CSV fr Mémo→"Argumentum - Règle" (DB canonical),
  re-derived 7 langs (brand-translated policy: Argumentum verbatim + suffix localized).
- Δ4 RuleContent: wire <h2>@Resources.RuleContent</h2> at view :47 (orphan heading
  resource now referenced) + add CSV row Contenu + 7 langs.

DB-side (manifest only, gated jsboige/ops — NO DB write from repo):
- Δ1 RuleMaterial: DB Materiel→Matériel (FR typo fix, eid=10340).
- Δ2 RuleMemoCard: DB Carte Mémo→Carte mémo (sentence case, eid=10340).

Byte-exact CSV mutation (CRLF + no-BOM preserved, QUOTE_MINIMAL); diff
backup-vs-result confirms only the 4 targeted cells + 1 new row changed.
View change = 1 line added (Razor template, DNN runtime — not compiled by .NET pipeline).

Gate: 0 prod write (repo data/template only). QA verdict = ai-01.

Relates: #490, #458, #681, #682, #669, dispatch 70iit0.

Co-authored-by: Claude-Code <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants